1 : <?php
2 : /*--------------------------------------------------------------------------+
3 : This file is part of eStudy.
4 : roleplay/classes/class.role.inc.php
5 : - Modulgruppe: Roleplay
6 : - Beschreibung: Klasse zum Erstellen eines Rollen-Objekts und Bereitstellen
7 : von entsprechenden Funktionen.
8 : - Version: 0.20, 16/12/06
9 : - Autor(en): Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
10 : +---------------------------------------------------------------------------+
11 : This program is free software; you can redistribute it and/or
12 : modify it under the terms of the GNU General Public License
13 : as published by the Free Software Foundation; either version 2
14 : of the License, or any later version.
15 : +---------------------------------------------------------------------------+
16 : This program is distributed in the hope that it will be useful,
17 : but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : GNU General Public License for more details.
20 : You should have received a copy of the GNU General Public License
21 : along with this program; if not, write to the Free Software
22 : Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 : +--------------------------------------------------------------------------*/
24 : /**
25 : * Klasse zum Erstellen eines Rollen-Objekts und Bereitstellen von entsprechenden Funktionen.
26 : * @package eStudy.Roleplay
27 : * @version 0.20, 16/12/06
28 : * @author Clemens Weiß <clemens.weiss@mni.fh-giessen.de>
29 : */
30 : require_once (PATH_TO_ROOT."roleplay/classes/class.roleset.inc.php");
31 : // für Semester-Funktionen
32 : require_once (PATH_TO_ROOT."courses/classes/class.Course.inc.php");
33 : // für BBCode
34 : require_once (PATH_TO_ROOT."common/classes/class.bbcode.inc.php");
35 : require_once (PATH_TO_ROOT."style/classes/class.style.inc.php");
36 : require_once (PATH_TO_ROOT."teams/classes/class.userteammanagement.inc.php");
37 : require_once (PATH_TO_ROOT."planspiel/classes/class.planspiellist.inc.php");
38 : class Role {
39 : /**
40 : * ID der Rolle
41 : * @var int
42 : * @access private
43 : */
44 : var $ID;
45 : /**
46 : * Name der Rolle
47 : * @var string
48 : * @access private
49 : */
50 : var $name;
51 : /**
52 : * Weiblicher Name der Rolle
53 : * @var string
54 : * @access private
55 : */
56 : var $nameFemale;
57 : /**
58 : * ID des Sets, zu dem die Rolle gehört
59 : * @var int
60 : * @access private
61 : */
62 : var $setID;
63 : /**
64 : * Name des Sets, zu dem die Rolle gehört
65 : * @var string
66 : * @access private
67 : */
68 : var $setName;
69 : /**
70 : * Avatar der Rolle
71 : * @var string
72 : * @access private
73 : */
74 : var $avatar;
75 : /**
76 : * Eigenschaften der Rolle
77 : * @var array
78 : * @access private
79 : */
80 : var $settings;
81 : /**
82 : * Konstruktor.
83 : * Erstellt das Rollen-Objekt mit den Daten der per ID bestimmten Rolle.
84 : * Wird eine ungültige ID (oder 0) übergeben, wird eine neue Rolle erstellt.
85 : *
86 : * @access public
87 : * @param int $roleID ID der Rolle oder 0 für neue Rolle
88 : * @param int $setID ID des Sets, dem die neue Rolle hinzugefügt werden soll
89 : */
90 : function Role($roleID, $setID = 0) {
91 0 : global $db, $settings;
92 0 : $dbp = $settings["dbPrefix"];
93 :
94 0 : $db->query("LOCK TABLES role_settings READ, role_settingtypes READ, roles READ, rolesets READ");
95 :
96 0 : $newRole = false;
97 0 : if (is_integer($roleID) && $roleID > 0) {
98 0 : $roleData = $db->get_row("SELECT * FROM {$dbp}roles WHERE id='$roleID'");
99 0 : if ($db->num_rows) {
100 0 : $this->ID = (int)$roleData->id;
101 0 : $this->name = $roleData->name;
102 0 : $this->nameFemale = !empty($roleData->name_female) ? $roleData->name_female : $roleData->name;
103 0 : $this->setID = (int)$roleData->set_id;
104 0 : $this->setName = $db->get_var("SELECT name FROM {$dbp}rolesets WHERE id='$roleData->set_id'");
105 0 : $this->avatar = $roleData->avatar;
106 0 : $this->settings = array();
107 0 : $roleSettingTypes = $db->get_results("SELECT * FROM {$dbp}role_settingtypes ORDER BY show_order");
108 0 : if ($db->num_rows) {
109 0 : $roleSettings = $db->get_results("SELECT * FROM {$dbp}role_settings WHERE role_id='$roleID'", ARRAY_A);
110 0 : $roleSettings = Utilities::setArrayIndexes($roleSettings, "setting_id");
111 :
112 0 : if ($roleSettingTypes != null) {
113 0 : foreach($roleSettingTypes as $roleSettingType) {
114 0 : if (isset($roleSettings[$roleSettingType->id])) {
115 0 : $this->settings[$roleSettingType->shortname]["value"] = $roleSettings[$roleSettingType->id]["value"];
116 0 : if ($roleSettingType->type == "b") {
117 0 : $this->settings[$roleSettingType->shortname]["value"] = (bool)$this->settings[$roleSettingType->shortname]["value"];
118 0 : }
119 0 : } else {
120 0 : if ($roleSettingType->type == "b") {
121 0 : $defaultValue = false;
122 0 : } else {
123 0 : $defaultValue = "";
124 : }
125 0 : $this->settings[$roleSettingType->shortname]["value"] = $defaultValue;
126 : }
127 0 : $this->settings[$roleSettingType->shortname]["ID"] = (int)$roleSettingType->id;
128 0 : $this->settings[$roleSettingType->shortname]["name"] = $roleSettingType->name;
129 0 : $this->settings[$roleSettingType->shortname]["regEx"] = (string)$roleSettingType->regex;
130 0 : $this->settings[$roleSettingType->shortname]["maxLength"] = (int)$roleSettingType->max_length;
131 0 : $this->settings[$roleSettingType->shortname]["type"] = $roleSettingType->type;
132 0 : $this->settings[$roleSettingType->shortname]["helpID"] = (int)$roleSettingType->help_id;
133 0 : }
134 0 : }
135 0 : }
136 0 : } else {
137 0 : $newRole = true;
138 : }
139 0 : } else {
140 0 : $newRole = true;
141 : }
142 0 : if ($newRole) {
143 0 : $this->setDefaultValues($setID);
144 0 : }
145 0 : $db->query("UNLOCK TABLES");
146 0 : }
147 : /**
148 : * Setzt Standardwerte für dieses Objekt, speichert die Änderungen aber
149 : * nicht in der Datenbank.
150 : *
151 : * @access private
152 : * @param int $setID ID des Sets, dem die neue Rolle hinzugefügt werden soll
153 : * @return void
154 : */
155 : function setDefaultValues($setID) {
156 0 : global $db, $settings;
157 0 : $dbp = $settings["dbPrefix"];
158 0 : $this->ID = 0;
159 0 : $this->name = "";
160 0 : $this->nameFemale = "";
161 0 : $this->setID = (is_integer($setID) ? $setID : 0);
162 0 : $this->setName = (is_integer($setID) ? $db->get_var("SELECT name FROM {$dbp}rolesets WHERE id='$setID'") : "");
163 0 : $this->avatar = "";
164 0 : $this->settings = array();
165 0 : $roleSettingTypes = $db->get_results("SELECT * FROM {$dbp}role_settingtypes ORDER BY show_order");
166 0 : if ($db->num_rows) {
167 0 : foreach($roleSettingTypes as $roleSettingType) {
168 0 : if ($roleSettingType->type == "b") {
169 0 : $defaultValue = false;
170 0 : } else {
171 0 : $defaultValue = "";
172 : }
173 0 : $this->settings[$roleSettingType->shortname]["ID"] = (int)$roleSettingType->id;
174 0 : $this->settings[$roleSettingType->shortname]["value"] = $defaultValue;
175 0 : $this->settings[$roleSettingType->shortname]["name"] = $roleSettingType->name;
176 0 : $this->settings[$roleSettingType->shortname]["regEx"] = (string)$roleSettingType->regex;
177 0 : $this->settings[$roleSettingType->shortname]["maxLength"] = (int)$roleSettingType->max_length;
178 0 : $this->settings[$roleSettingType->shortname]["type"] = $roleSettingType->type;
179 0 : $this->settings[$roleSettingType->shortname]["helpID"] = (int)$roleSettingType->help_id;
180 0 : }
181 0 : }
182 0 : }
183 : /**
184 : * Zeigt ein Formular zum Bearbeiten der Rolle an.
185 : * Wird der Funktion kein Array mit den anzuzeigenden Daten (z.B. $_POST-
186 : * Array) übergeben, werden die Daten der aktuellen Rolle angezeigt. Es
187 : * erfolgt keine Validierung und Speicherung dieser Daten, dazu kann die
188 : * Methode setData() verwendet werden.
189 : *
190 : * @access public
191 : * @param array $data Assoziatives Array der im Formular anzuzeigenden Daten
192 : * @return void
193 : */
194 : function showEditForm($data = null) {
195 0 : global $db, $settings;
196 0 : $dbp = $settings["dbPrefix"];
197 0 : echo "<form action=\"".PATH_TO_ROOT.SCRIPT_NAME."\" method=\"post\">\n";
198 0 : echo "<p class='pForm'><input type=\"hidden\" name=\"ID\" id=\"ID\" value=\"{$this->ID}\" />\n";
199 0 : echo "<input type=\"hidden\" name=\"setID\" id=\"setID\" value=\"{$this->setID}\" /></p>\n";
200 0 : echo "<table class='contentTable'>\n";
201 0 : if ($this->ID > 0) {
202 0 : Output::echoTableHead("Rolle bearbeiten", 3);
203 0 : } else {
204 0 : Output::echoTableHead("Neue Rolle erstellen", 3);
205 : }
206 0 : $name = Data::toHTML(isset($data["name"]) ? $data["name"] : $this->name);
207 0 : echo "<tr valign=\"top\">"."<td><label for=\"name\">Männliche Bezeichnung</label></td>"."<td><p class='pForm'><input type=\"text\" name=\"name\" id=\"name\" value=\"$name\" maxlength=\"255\" /></p></td>"."<td>";
208 0 : Utilities::help(0);
209 0 : echo "</td></tr>\n";
210 0 : $nameFemale = Data::toHTML(isset($data["nameFemale"]) ? $data["nameFemale"] : $this->nameFemale);
211 0 : echo "<tr valign=\"top\">"."<td><label for=\"nameFemale\">Weibliche Bezeichnung</label></td>"."<td><p class='pForm'><input type=\"text\" name=\"nameFemale\" id=\"nameFemale\" value=\"$nameFemale\" maxlength=\"255\" /></p></td>"."<td>";
212 0 : Utilities::help(0);
213 0 : echo "</td></tr>\n";
214 0 : $forumavatar = (isset($data["forumavatar"]) ? $data["forumavatar"] : $this->avatar);
215 0 : $avatarurl = Data::toHTML(isset($data["avatarurl"]) ? $data["avatarurl"] : $this->avatar);
216 0 : if (substr($avatarurl, 0, 7) == "avatar/" || $avatarurl == "userpicture" || $avatarurl == "forumavatar") $avatarurl = "";
217 0 : echo "<tr valign=\"top\">"."<td><label for=\"forumavatar\">Avatar</label>"."<p class='center'><img src=\"".$this->getAvatarURL($_SESSION["userid"]) ."\" alt=\"Avatar\" id=\"avatarpreview\" /></p></td>\n"."<td><p class='pForm'><label for=\"forumavatar\">Forum-Avatar</label><br />"."<select name=\"forumavatar\" id=\"forumavatar\" onchange=\"var avatarurl=document.getElementById('avatarurl').value;if(this.value=='avatar/noavatar.png'&&avatarurl!=''){document.getElementById('avatarpreview').src=avatarurl}else{document.getElementById('avatarpreview').src='".PATH_TO_ROOT."forum/'+this.value;}\" size=\"5\">\n"."<option value=\"avatar/noavatar.png\"".($forumavatar == "avatar/noavatar.png" || !empty($avatarurl) ? " selected=\"selected\"" : "") .">* Kein Avatar *</option>\n"."<option value=\"userpicture\"".($forumavatar == "userpicture" ? " selected=\"selected\"" : "") .">* Portal-Bild *</option>\n"."<option value=\"forumavatar\"".($forumavatar == "forumavatar" ? " selected=\"selected\"" : "") .">* Forums-Avatar *</option>\n";
218 0 : foreach($db->get_results("SELECT * FROM {$dbp}forum_avatar WHERE avatarurl NOT LIKE '%noavatar.png' ORDER BY avatarname") as $avatar) {
219 0 : echo "<option value=\"{$avatar->avatarurl}\"".($forumavatar == $avatar->avatarurl ? " selected=\"selected\"" : "") .">{$avatar->avatarname}</option>\n";
220 0 : }
221 0 : echo "</select><br />oder<br />\n"."<label for=\"avatarurl\">Externes Avatar</label><br />"."<input type=\"text\" name=\"avatarurl\" id=\"avatarurl\" value=\"$avatarurl\" maxlength=\"255\" /></p></td>"."<td class=\"tableCell\">";
222 0 : Utilities::help(0);
223 0 : echo "</td></tr>\n";
224 0 : foreach($this->settings as $shortname => $setting) {
225 0 : $value = (isset($data[$shortname]) ? $data[$shortname] : $setting["value"]);
226 0 : echo "<tr valign=\"top\">";
227 0 : echo "<td><label for=\"$shortname\">".Data::toHTML($setting["name"], false) ."</label></td><td>";
228 0 : if ($shortname == "style") {
229 0 : $styles = Style::getStyleTemplates();
230 0 : echo "<p class='pForm'><select name=\"$shortname\" id=\"$shortname\">";
231 0 : echo "<option value='' style='font-style: italic;'>Vom Benutzer gewählter Style</option>";
232 0 : foreach($styles as $style) {
233 0 : echo "<option value=\"$style[0]\"".($style[0] == $value ? " selected='selected'" : "") .">".Data::toHTML($style[1], false) ."</option>";
234 0 : }
235 0 : echo "</select></p>";
236 0 : } else {
237 0 : switch ($setting["type"]) {
238 0 : case "l": // line
239 0 : echo "<p class='pForm'><input type=\"text\" name=\"$shortname\" id=\"$shortname\" value=\"".Data::toHTML($value) ."\" maxlength=\"{$setting['maxLength']}\" /></p>";
240 0 : break;
241 :
242 0 : case "m": // multiline
243 0 : echo "<p class='pForm'><textarea name=\"$shortname\" id=\"$shortname\" rows=\"5\" cols=\"50\">".Data::toHTML($value) ."</textarea></p>";
244 0 : break;
245 :
246 0 : case "b": // boolean
247 0 : $value = (bool)$value;
248 0 : echo "<fieldset id=\"$shortname\">"."<input type=\"radio\" name=\"$shortname\" id=\"{$shortname}1\" value=\"1\" ".($value ? "checked=\"checked\" " : "") ."/> <label for=\"{$shortname}1\">Ja</label> "."<input type=\"radio\" name=\"$shortname\" id=\"{$shortname}0\" value=\"0\" ".(!$value ? "checked=\"checked\" " : "") ."/> <label for=\"{$shortname}0\">Nein</label>"."</fieldset>";
249 0 : break;
250 0 : }
251 : }
252 0 : echo "</td><td>";
253 0 : Utilities::help($setting["helpID"]);
254 0 : echo "</td></tr>\n";
255 0 : }
256 0 : Output::echoDialogBottom(array("okButton" => "Speichern", "cancelButton" => ""), 3);
257 0 : echo "</table>\n</form>\n";
258 0 : $placeholder = array("%username%" => "Vor- und Nachname des aktuellen Benutzers", "%coursename%" => "Name des aktuellen Kurses", "%coursename_short%" => "Kurzname des aktuellen Kurses", "%semester%" => "Aktuelles Semester", "%rolename%" => "Rollenname", "%rolesetname%" => "Name des Rollensets", "%roleavatar%" => "Avatar der Rolle in [img]-Tags", "%teamname%" => "Name des Teams des aktuellen Benutzers", "%teamlogo%" => "Logo des Teams in [img]-Tags", "%planspielname%" => "Namen der Planspiele des Benutzers", "%planspielphase%" => "Namen der aktuellen Planspielphasen", "%portalname%" => "Titel des Portals", "%portallogo%" => "eStudy-Logo des Portals",);
259 0 : echo "<table class='contentTable'>";
260 0 : Output::echoTableHead("Es stehen folgende Platzhalter zur Verfügung", 3);
261 0 : echo "<tr><th>Platzhalter</th><th>Beschreibung</th><th>Anzeige (je nach Benutzer)</th></tr>";
262 0 : $bbcode = new BBCode();
263 0 : foreach($placeholder as $name => $desc) {
264 0 : $example = $this->insertVariables($name);
265 0 : if (empty($example)) {
266 0 : $example = "<em>Nur, wenn gesetzt.</em>";
267 0 : } else {
268 0 : $example = $bbcode->parse($example);
269 : }
270 0 : echo "<tr valign='top'><td style='font-weight: bold;'>$name</td><td>$desc</td><td>$example</td></tr>";
271 0 : }
272 0 : echo "</table>";
273 0 : }
274 : /**
275 : * Gibt eine Tabelle mit den für die Rolle festgelegten Eigenschaften aus.
276 : *
277 : * @access public
278 : * @return void
279 : */
280 : function showProperties() {
281 0 : $bbcode = new BBCode();
282 0 : $roleSet = new RoleSet($this->setID);
283 0 : echo "<table class='tableBorder roleProperties'>";
284 0 : Output::echoTableHead($this->getIcon() ." ".Data::toHTML($this->name, false), 2);
285 0 : echo "<tr><th>Rollenset</th><td>".Data::toHTML($roleSet->getName(), false) ."</td></tr>";
286 0 : echo "<tr><th>Beschreibung des Rollensets</th><td>".$bbcode->parse($roleSet->getDescription()) ."</td></tr>";
287 0 : echo "<tr><th>Avatar</th><td>".(($url = $this->getAvatarURL($_SESSION["userid"])) ? "<img src='$url' alt='Rollenavatar' />" : "") ."</td></tr>";
288 0 : foreach($this->settings as $shortname => $setting) {
289 0 : echo "<tr><th>".Data::toHTML($setting["name"], false) ."</th><td>";
290 0 : if ($shortname == "style") {
291 0 : if (empty($setting["value"])) {
292 0 : echo "<em>Vom Benutzer gewählter Style</em>";
293 0 : } else {
294 0 : $styles = Style::getStyleTemplates();
295 0 : foreach($styles as $style) {
296 0 : if ($setting["value"] == $style[0]) {
297 0 : echo Data::toHTML($style[1], false);
298 0 : break;
299 : }
300 0 : }
301 : }
302 0 : } else {
303 0 : switch ($setting["type"]) {
304 0 : case "l": // line
305 :
306 0 : case "m": // multiline
307 0 : echo $bbcode->parse($this->insertVariables($setting["value"]));
308 0 : break;
309 :
310 0 : case "b": // boolean
311 0 : echo $setting["value"] ? "Ja" : "Nein";
312 0 : break;
313 0 : }
314 : }
315 0 : echo "</td></tr>";
316 0 : }
317 0 : echo "</table>";
318 0 : }
319 : /**
320 : * Ersetzt im übergebenen Text folgende Platzhalter durch ihre Werte:
321 : * %username% - Vor- und Nachname des aktuellen Benutzers
322 : * %coursename% - Name des aktuellen Kurses
323 : * %coursename_short% - Kurzname des aktuellen Kurses
324 : * %semester% - aktuelles Semester
325 : * %rolename% - Rollenname
326 : * %rolesetname% - Name des Rollensets
327 : * %roleavatar% - Avatar der Rolle in [img]-Tags
328 : * %teamname% - Name des Teams des aktuellen Benutzers
329 : * %planspielname% - Namen der Planspiele des Benutzers
330 : * %planspielphase% - Namen der aktuellen Planspielphasen
331 : * %portalname% - Titel des Portals
332 : * %portallogo% - eStudy-Logo des Portals
333 : *
334 : * @access public
335 : * @param string $value Zu bearbeitender Text
336 : * @return string Bearbeiteter Text
337 : */
338 : function insertVariables($value) {
339 0 : global $db, $settings;
340 0 : $dbp = $settings["dbPrefix"];
341 0 : if (substr_count($value, "%") < 2) return $value;
342 0 : $value = str_replace("%username%", $_SESSION["Vorname"]." ".$_SESSION["Nachname"], $value);
343 0 : if (substr_count($value, "%coursename%") || substr_count($value, "%coursename_short%")) {
344 0 : if ($_SESSION["course"] > 0) {
345 0 : $courseData = $db->get_row("SELECT Name, ShortName FROM {$dbp}courses WHERE ID='{$_SESSION['course']}'", ARRAY_A);
346 0 : } else {
347 0 : $courseData = array("Name" => "Foyer", "ShortName" => "Foyer");
348 : }
349 0 : $value = str_replace("%coursename%", $courseData["Name"], $value);
350 0 : $value = str_replace("%coursename_short%", $courseData["ShortName"], $value);
351 0 : }
352 0 : $value = str_replace("%semester%", Course::semesterDBtoString(CourseUtil::getCurrentSemester()), $value);
353 0 : $value = str_replace("%rolename%", $this->getName($_SESSION["gender"]), $value);
354 0 : $value = str_replace("%rolesetname%", $this->setName, $value);
355 0 : if (substr_count($value, "%roleavatar%")) {
356 0 : $url = html_entity_decode($this->getAvatarURL($_SESSION["userid"]), ENT_COMPAT, $settings["charset"]);
357 0 : if (!empty($url)) {
358 0 : if (!Utilities::validateURL($url)) {
359 0 : $url = substr($url, strlen(PATH_TO_ROOT));
360 0 : $url = "http://".$_SERVER["HTTP_HOST"].str_replace(SCRIPT_NAME, $url, $_SERVER["PHP_SELF"]);
361 0 : }
362 0 : $value = str_replace("%roleavatar%", "[img]{$url}[/img]", $value);
363 0 : } else {
364 0 : $value = str_replace("%roleavatar%", "", $value);
365 : }
366 0 : }
367 0 : if (substr_count($value, "%teamname%") || substr_count($value, "%teamlogo%")) {
368 0 : if (Utilities::isInstalled("teams")) {
369 0 : $utm = new UserTeamManagement($_SESSION["course"]);
370 0 : $team = $utm->getTeamOfUser($_SESSION["userid"]);
371 0 : if ($team) {
372 0 : $value = str_replace("%teamname%", $team->getName(), $value);
373 0 : if ($team->getLogo() != "") {
374 0 : $value = str_replace("%teamlogo%", "[img]".$team->getLogo() ."[/img]", $value);
375 0 : } else {
376 0 : $value = str_replace("%teamlogo%", "", $value);
377 : }
378 0 : } else {
379 0 : $value = str_replace("%teamname%", "", $value);
380 0 : $value = str_replace("%teamlogo%", "", $value);
381 : }
382 0 : } else {
383 0 : $value = str_replace("%teamname%", "", $value);
384 0 : $value = str_replace("%teamlogo%", "", $value);
385 : }
386 0 : }
387 0 : if (substr_count($value, "%planspielname%") || substr_count($value, "%planspielphase%")) {
388 0 : if (Utilities::isInstalled("planspiel")) {
389 0 : $planspiele = PlanspielList::getPlanspielOfUser($_SESSION["course"], $_SESSION["userid"]);
390 0 : $planspielStr = "";
391 0 : $phaseStr = "";
392 0 : foreach($planspiele as $planspiel) {
393 0 : $planspielStr.= $planspiel->getName() .", ";
394 0 : $phase = $planspiel->getCurrentPhase();
395 0 : if ($phase) {
396 0 : $phaseStr.= $phase->getName() .", ";
397 0 : } else {
398 0 : $phaseStr.= "[i]keine[/i], ";
399 : }
400 0 : }
401 0 : $planspielStr = substr($planspielStr, 0, -2);
402 0 : $phaseStr = substr($phaseStr, 0, -2);
403 0 : $value = str_replace("%planspielname%", $planspielStr, $value);
404 0 : $value = str_replace("%planspielphase%", $phaseStr, $value);
405 0 : } else {
406 0 : $value = str_replace("%planspielname%", "", $value);
407 0 : $value = str_replace("%planspielphase%", "", $value);
408 : }
409 0 : }
410 0 : $value = str_replace("%portalname%", $settings["label"], $value);
411 0 : $value = str_replace("%portallogo%", "[img]http://".$_SERVER["HTTP_HOST"].str_replace(SCRIPT_NAME, "images/logo_estudy.gif", $_SERVER["PHP_SELF"]) ."[/img]", $value);
412 0 : return $value;
413 : }
414 : /**
415 : * Löscht diese Rolle inkl. aller Einstellungen und Zuordnungen zu
416 : * Mitgliedern.
417 : * Alle Eigenschaften dieses Objekts werden auf Standardwerte gesetzt, so
418 : * dass damit gleich eine neue Rolle erzeugt werden kann.
419 : *
420 : * @access public
421 : * @return boolean Erfolgswert
422 : */
423 : function deleteRole() {
424 0 : global $db, $settings;
425 0 : $dbp = $settings["dbPrefix"];
426 0 : $db->query("DELETE FROM {$dbp}roles WHERE id='$this->ID'");
427 0 : if (!$db->rows_affected) {
428 0 : return false;
429 : }
430 0 : $db->query("DELETE FROM {$dbp}role_settings WHERE role_id='$this->ID'");
431 0 : $db->query("DELETE FROM {$dbp}user_roles WHERE role_id='$this->ID'");
432 0 : $db->query("DELETE FROM {$dbp}role_artefacts WHERE role_id='$this->ID'");
433 0 : $this->setDefaultValues($this->setID);
434 0 : return true;
435 : }
436 : /**
437 : * Versucht, die im übergebenen Array vorhandenen Daten anhand der
438 : * assoziativen Array-Indizes als neue Rollen-Daten abzuspeichern. Dabei
439 : * kann es sich zum Beispiel um das $_POST-Array handeln. Es werden dabei
440 : * entweder alle oder keine Daten gespeichert. Sind einige der Daten
441 : * fehlerhaft, wird ein String mit Fehlermeldungen zurückgeliefert, sonst
442 : * der boolsche Wert true.
443 : *
444 : * @access public
445 : * @param array $data Assoziatives Array mit den neuen Werten
446 : * @return mixed String mit Fehlermeldungen oder true bei Erfolg
447 : */
448 : function setData($data) {
449 0 : $errors = "";
450 0 : if (($result = $this->validateName($data["name"])) !== true) {
451 0 : $errors.= $result."\n";
452 0 : }
453 0 : if (($result = $this->validateNameFemale($data["nameFemale"])) !== true) {
454 0 : $errors.= $result."\n";
455 0 : }
456 0 : if (($result = $this->validateAvatar($data["forumavatar"], $data["avatarurl"])) !== true) {
457 0 : $errors.= $result."\n";
458 0 : }
459 0 : foreach($this->settings as $shortname => $setting) {
460 0 : if (isset($data[$shortname]) && !empty($data[$shortname])) {
461 0 : if (($result = $this->validateSetting($shortname, $data[$shortname])) !== true) {
462 0 : $errors.= $result."\n";
463 0 : }
464 0 : }
465 0 : }
466 0 : if (empty($errors)) {
467 0 : if (!$this->setName($data["name"])) {
468 0 : return "Bezeichnung konnte nicht gespeichert werden.";
469 : }
470 0 : if (!$this->setNameFemale($data["nameFemale"])) {
471 0 : return "Weibliche Bezeichnung konnte nicht gespeichert werden.";
472 : }
473 0 : if (empty($data["avatarurl"])) {
474 0 : if (!$this->setAvatar($data["forumavatar"])) {
475 0 : return "Forum-Avatar konnte nicht gespeichert werden.";
476 : }
477 0 : } else {
478 0 : if (!$this->setAvatar($data["avatarurl"])) {
479 0 : return "Externes Avatar konnte nicht gespeichert werden.";
480 : }
481 : }
482 0 : foreach($this->settings as $shortname => $setting) {
483 0 : if (!$this->setSetting($shortname, $data[$shortname])) {
484 0 : return $setting["name"]." konnte nicht gespeichert werden.";
485 : }
486 0 : }
487 0 : return true;
488 : }
489 0 : return trim($errors);
490 : }
491 : /**
492 : * Erstellt den grundlegenden Datenbankeintrag für die Rolle. Gesetzt werden
493 : * nur Set-ID und Avatar, die anderen Felder werden mit ihren Standardwerten
494 : * belegt.
495 : *
496 : * @access private
497 : * @return boolean Erfolgswert
498 : */
499 : function createRole() {
500 0 : global $db, $settings;
501 0 : $dbp = $settings["dbPrefix"];
502 0 : $db->query("INSERT INTO {$dbp}roles (set_id, avatar) VALUES ('$this->setID', '".Data::toMysql($this->avatar) ."')");
503 0 : if ($db->rows_affected) {
504 0 : $this->ID = $db->insert_id;
505 0 : return true;
506 : }
507 0 : return false;
508 : }
509 : /**
510 : * Erstellt eine identische Kopie dieser Rolle inkl. allen Einstellungen für
511 : * das angegebene Set.
512 : *
513 : * @access public
514 : * @param int $setID ID des Sets, zum dem die Kopie gehören soll
515 : * @return mixed ID der neu erzeugten Kopie oder false bei Fehler
516 : */
517 : function copyRole($setID) {
518 0 : global $db, $settings;
519 0 : $dbp = $settings["dbPrefix"];
520 0 : $copy = new Role(0, (int)$setID);
521 0 : if ($copy->validateName($this->name) !== true) {
522 0 : return false; // Rolle mit dem Namen bereits vorhanden
523 :
524 : }
525 0 : if (!$copy->setName($this->name) || !$copy->setNameFemale($this->nameFemale) || !$copy->setAvatar($this->avatar)) {
526 0 : if ($copy->getID() > 0) {
527 0 : $copy->deleteRole();
528 0 : }
529 0 : return false;
530 : }
531 0 : foreach($this->settings as $shortname => $setting) {
532 0 : if (!$copy->setSetting($shortname, $setting["value"])) {
533 0 : $copy->deleteRole();
534 0 : return false;
535 : }
536 0 : }
537 0 : $db->query("UPDATE {$dbp}roles SET source_id='$this->ID' WHERE id='".$copy->getID() ."'");
538 0 : return $copy->getID();
539 : }
540 : /**
541 : * Gibt zurück, ob der Rolleninhaber Zugriff auf ein Modul hat, das sonst für ihn nicht
542 : * erreichbar wäre.
543 : *
544 : * @access public
545 : * @param string $script Dateiname des Scripts, wie er in der modules-Tabelle steht
546 : * @return boolean true, wenn Zugriff gestattet, sonst false
547 : */
548 : function hasAccess($script) {
549 0 : if (!is_string($script) || empty($script)) {
550 0 : return false;
551 : }
552 0 : $scripts = array();
553 0 : foreach($this->settings as $setting) {
554 0 : if ($setting["type"] == "b" && $setting["value"] && !empty($setting["regEx"])) {
555 0 : $scripts = array_merge($scripts, explode(",", $setting["regEx"]));
556 0 : }
557 0 : }
558 0 : $scripts = array_map("trim", $scripts);
559 0 : return in_array($script, $scripts);
560 : }
561 : /**
562 : * Gibt eine Einstellung der Rolle zurück.
563 : * Welche Einstellungen verfügbar sind, hängt vom Inhalt der DB-Tabelle
564 : * role_settingtypes ab. Zusätzlich zum Inhalt eines Feldes der Spalte
565 : * shortname ist hier die Angabe "avatar" möglich.
566 : * Ist die Einstellung nicht vorhanden, wird ein leerer String
567 : * zurückgeliefert.
568 : *
569 : * @access public
570 : * @param string $name Name der Einstellung
571 : * @param bool $insertVariables Gibt an, ob die Platzhalter im Text durch ihre Werte ersetzt werden sollen
572 : * @return mixed Einstellung, Typ je nach Angabe in DB, entweder String oder Boolean
573 : */
574 : function getSetting($name, $insertVariables = false) {
575 0 : if (is_string($name)) {
576 0 : if ($name == "avatar") {
577 0 : return $this->getAvatarURL($_SESSION["userid"]);
578 0 : } elseif (isset($this->settings[$name])) {
579 0 : if ($insertVariables) {
580 0 : return $this->insertVariables($this->settings[$name]["value"]);
581 : }
582 0 : return $this->settings[$name]["value"];
583 : }
584 0 : }
585 0 : return "";
586 : }
587 : /**
588 : * Überprüft eine übergebene Einstellung auf Gültigkeit.
589 : *
590 : * @access public
591 : * @param string $name Name der Einstellung
592 : * @param string $value Der zu überprüfende Einstellungswert
593 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
594 : */
595 : function validateSetting($name, $value) {
596 0 : $setting = $this->settings[$name];
597 0 : if ($name == "style") {
598 0 : $styles = Style::getStyleTemplates();
599 0 : foreach($styles as $style) {
600 0 : if ($style[0] == $value) {
601 0 : return true;
602 : }
603 0 : }
604 0 : return "Style nicht vorhanden.";
605 0 : } elseif ($setting["type"] == "b") {
606 0 : if ($value != 0 && $value != 1) return "Ungültiger boolscher Wert von ".$setting["name"].".";
607 0 : } else {
608 0 : $value = trim(Data::gpcUnescape($value));
609 0 : if (strlen($value) > $setting["maxLength"] && $setting["maxLength"] > 0) return $setting["name"]." ist zu lang (max. ".$setting["maxLength"]." Zeichen).";
610 0 : if (!empty($value) && !empty($setting["regEx"]) && !preg_match($setting["regEx"], $value)) return $setting["name"]." enthält ungültige Zeichen.";
611 : }
612 0 : return true;
613 : }
614 : /**
615 : * Speichert den übergebenen String als neue Einstellung dieser Rolle.
616 : * Der String sollte vorher mit der Methode validateSetting() validiert
617 : * worden sein!
618 : *
619 : * @access public
620 : * @param string $name Name der zu speichernden Einstellung
621 : * @param string $value Wert der zu speichernden Einstellung
622 : * @return boolean Erfolgswert
623 : */
624 : function setSetting($name, $value) {
625 0 : global $db, $settings;
626 0 : $dbp = $settings["dbPrefix"];
627 0 : $setting = $this->settings[$name];
628 0 : $value = trim($value);
629 0 : if ($setting["type"] == "b") {
630 0 : $value = (bool)$value;
631 0 : }
632 0 : if ($setting["value"] == (is_bool($value) ? $value : Data::gpcUnescape($value))) {
633 0 : return true;
634 : }
635 0 : if ($this->ID == 0) {
636 0 : if (!$this->createRole()) {
637 0 : return false;
638 : }
639 0 : }
640 0 : if (empty($value) || $value === false) {
641 0 : $db->query("DELETE FROM {$dbp}role_settings WHERE role_id='$this->ID' AND setting_id='{$setting['ID']}'");
642 0 : } else {
643 0 : if (empty($setting["value"]) || $setting["value"] === false) {
644 0 : $db->query("INSERT INTO {$dbp}role_settings (role_id, setting_id, value) VALUES ('$this->ID', '{$setting['ID']}', '".(is_bool($value) ? (int)$value : Data::toMysql($value)) ."')");
645 0 : } else {
646 0 : $db->query("UPDATE {$dbp}role_settings SET value='".(is_bool($value) ? (int)$value : Data::toMysql($value)) ."' WHERE role_id='$this->ID' AND setting_id='{$setting['ID']}'");
647 : }
648 : }
649 0 : if ($db->rows_affected) {
650 0 : $this->settings[$name]["value"] = (is_bool($value) ? $value : Data::gpcUnescape($value));
651 0 : return true;
652 : }
653 0 : return false;
654 : }
655 : /**
656 : * Gibt die URL des Avatars der Rolle zurück. Entweder die komplette URL
657 : * eines externen Avatars oder die relative Pfadangabe zu einem Forum-
658 : * Avatar.
659 : *
660 : * @access public
661 : * @param int $userID ID des Benutzers, dessen Avatar angezeigt werden soll (für Benutzerbild)
662 : * @return string Avatar-URL
663 : */
664 : function getAvatarURL($userID) {
665 0 : global $db, $settings;
666 0 : $dbp = $settings["dbPrefix"];
667 0 : $avatar = $this->avatar;
668 0 : if ($avatar == "forumavatar" && strval(intval($userID)) == $userID && $userID > 0) {
669 0 : $avatar = $db->get_var("SELECT useravatar FROM {$dbp}forum_user WHERE userID='$userID'");
670 0 : }
671 0 : if (empty($avatar) || $avatar == "avatar/noavatar.png" || $avatar == "avatar/noavatar.gif") {
672 0 : return "";
673 : }
674 0 : if (Utilities::validateURL($avatar)) {
675 0 : return $avatar;
676 : }
677 0 : if ($avatar == "userpicture" && strval(intval($userID)) == $userID && $userID > 0) {
678 0 : $userPic = $db->get_var("SELECT picture FROM {$dbp}user WHERE ID='$userID'");
679 0 : $picURL = PATH_TO_ROOT.$settings["upload_path"]."user/$userID/$userPic";
680 0 : if (!empty($userPic) && file_exists($picURL)) {
681 0 : $height = $db->get_var("SELECT keyvalue FROM {$dbp}forum_registry WHERE keyname='avatarheight'");
682 0 : $width = $db->get_var("SELECT keyvalue FROM {$dbp}forum_registry WHERE keyname='avatarwidth'");
683 0 : return PATH_TO_ROOT."common/makethumb.php?picurl=".rawurlencode($picURL) ."&maxh=$height&maxw=$width";
684 : } else {
685 0 : return "";
686 : }
687 : }
688 0 : return PATH_TO_ROOT."forum/".$avatar;
689 : }
690 : /**
691 : * Überprüft die übergebenen Avatare auf Gültigkeit.
692 : *
693 : * @access public
694 : * @param string $forumavatar Das zu überprüfende Forumavatar aus der
695 : * select-Box
696 : * @param string $avatarurl Die zu überprüfende externe Avatar-URL
697 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
698 : */
699 : function validateAvatar($forumavatar, $avatarurl) {
700 0 : global $db, $settings;
701 0 : $dbp = $settings["dbPrefix"];
702 0 : $forumavatar = trim(Data::gpcUnescape($forumavatar));
703 0 : $avatarurl = trim(Data::gpcUnescape($avatarurl));
704 0 : if (empty($forumavatar) && empty($avatarurl)) return "Es wurde kein Avatar ausgewählt.";
705 0 : if ($forumavatar != "userpicture" && $forumavatar != "forumavatar" && !in_array($forumavatar, $db->get_col("SELECT avatarurl FROM {$dbp}forum_avatar"))) return "Das Forum-Avatar ist ungültig.";
706 0 : if (!empty($avatarurl) && !Utilities::validateURL($avatarurl)) return "Das externe Avatar ist keine gültige URL.";
707 0 : return true;
708 : }
709 : /**
710 : * Speichert den übergebenen String als neuen Avatar dieser Rolle.
711 : * Der String sollte vorher mit der Methode validateAvatar() validiert
712 : * worden sein!
713 : *
714 : * @access public
715 : * @param string $name Zu speicherndes Avatar
716 : * @return boolean Erfolgswert
717 : */
718 : function setAvatar($avatar) {
719 0 : global $db, $settings;
720 0 : $dbp = $settings["dbPrefix"];
721 0 : $avatar = trim($avatar);
722 0 : if ($this->avatar == Data::gpcUnescape($avatar)) {
723 0 : return true;
724 : }
725 0 : if ($this->ID == 0) {
726 0 : if (!$this->createRole()) {
727 0 : return false;
728 : }
729 0 : }
730 0 : $db->query("UPDATE {$dbp}roles SET avatar='".Data::toMysql($avatar) ."' WHERE id='$this->ID'");
731 0 : if ($db->rows_affected) {
732 0 : $this->avatar = Data::gpcUnescape($avatar);
733 0 : return true;
734 : }
735 0 : return false;
736 : }
737 : /**
738 : * Gibt die ID der Rolle zurück.
739 : *
740 : * @access public
741 : * @return int ID der Rolle
742 : */
743 : function getID() {
744 0 : return $this->ID;
745 : }
746 : /**
747 : * Gibt den Namen der Rolle zurück.
748 : *
749 : * @access public
750 : * @param int $gender Geschlecht: 0 - unbestimmt, 1 - männlich, 2 - weiblich
751 : * @return string Name der Rolle
752 : */
753 : function getName($gender = 0) {
754 0 : if ($gender == 2) {
755 0 : return $this->getNameFemale();
756 : }
757 0 : return $this->name;
758 : }
759 : /**
760 : * Gibt den weiblichen Namen der Rolle zurück.
761 : *
762 : * @access public
763 : * @return string Weiblicher Name der Rolle
764 : */
765 : function getNameFemale() {
766 0 : return $this->nameFemale;
767 : }
768 : /**
769 : * Speichert den übergebenen String als neue Bezeichnung dieser Rolle.
770 : * Der String sollte vorher mit der Methode validateName() validiert worden
771 : * sein!
772 : *
773 : * @access public
774 : * @param string $name Zu speichernde Bezeichnung
775 : * @return boolean Erfolgswert
776 : */
777 : function setName($name) {
778 0 : global $db, $settings;
779 0 : $dbp = $settings["dbPrefix"];
780 0 : $name = trim($name);
781 0 : if ($this->name == Data::gpcUnescape($name)) {
782 0 : return true;
783 : }
784 0 : if ($this->ID == 0) {
785 0 : if (!$this->createRole()) {
786 0 : return false;
787 : }
788 0 : }
789 0 : $db->query("UPDATE {$dbp}roles SET name='".Data::toMysql($name) ."' WHERE id='$this->ID'");
790 0 : if ($db->rows_affected) {
791 0 : $this->name = Data::gpcUnescape($name);
792 0 : return true;
793 : }
794 0 : return false;
795 : }
796 : /**
797 : * Speichert den übergebenen String als neue weibliche Bezeichnung dieser Rolle.
798 : * Der String sollte vorher mit der Methode validateName() validiert worden
799 : * sein!
800 : *
801 : * @access public
802 : * @param string $name Zu speichernde Bezeichnung
803 : * @return boolean Erfolgswert
804 : */
805 : function setNameFemale($name) {
806 0 : global $db, $settings;
807 0 : $dbp = $settings["dbPrefix"];
808 0 : $name = trim($name);
809 0 : if ($this->nameFemale == Data::gpcUnescape($name)) {
810 0 : return true;
811 : }
812 0 : if ($this->ID == 0) {
813 0 : if (!$this->createRole()) {
814 0 : return false;
815 : }
816 0 : }
817 0 : $db->query("UPDATE {$dbp}roles SET name_female='".Data::toMysql($name) ."' WHERE id='$this->ID'");
818 0 : if ($db->rows_affected) {
819 0 : $this->nameFemale = Data::gpcUnescape($name);
820 0 : return true;
821 : }
822 0 : return false;
823 : }
824 : /**
825 : * Überprüft die übergebene Bezeichnung auf Gültigkeit.
826 : *
827 : * @access public
828 : * @param string $name Der zu überprüfende String
829 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
830 : */
831 : function validateName($name) {
832 0 : global $db, $settings;
833 0 : $dbp = $settings["dbPrefix"];
834 0 : $name = trim(Data::gpcUnescape($name));
835 0 : if (empty($name)) return "Die Bezeichnung wurde nicht angegeben.";
836 0 : if (!preg_match("/^[a-zäöüßÄÖÜ0-9\/\-_ \(\)&'\"\.,]+$/i", $name)) return "Die Bezeichnung enthält ungültige Zeichen.";
837 0 : if (strlen($name) > 255) return "Die Bezeichnung ist zu lang.";
838 0 : if ($this->ID == 0 && $db->get_var("SELECT COUNT(*) FROM {$dbp}roles WHERE name='".Data::toMysql($name, false) ."' AND set_id='$this->setID'") > 0) return "Eine Rolle mit dieser Bezeichnung ist bereits vorhanden.";
839 0 : return true;
840 : }
841 : /**
842 : * Überprüft die übergebene weibliche Bezeichnung auf Gültigkeit.
843 : *
844 : * @access public
845 : * @param string $name Der zu überprüfende String
846 : * @return mixed String mit Fehlerangabe oder true bei Erfolg
847 : */
848 : function validateNameFemale($name) {
849 0 : global $db, $settings;
850 0 : $dbp = $settings["dbPrefix"];
851 0 : $name = trim(Data::gpcUnescape($name));
852 0 : if (!preg_match("/^[a-zäöüßÄÖÜ0-9\/\-_ \(\)&'\"\.,]+$/i", $name)) return "Die weibliche Bezeichnung enthält ungültige Zeichen.";
853 0 : if (strlen($name) > 255) return "Die weibliche Bezeichnung ist zu lang.";
854 0 : if ($this->ID == 0 && $db->get_var("SELECT COUNT(*) FROM {$dbp}roles WHERE name_female='".Data::toMysql($name, false) ."' AND set_id='$this->setID'") > 0) return "Eine Rolle mit dieser weiblichen Bezeichnung ist bereits vorhanden.";
855 0 : return true;
856 : }
857 : /**
858 : * Gibt die ID des Sets zurück, das die Rolle enthält.
859 : *
860 : * @access public
861 : * @return int ID der Sets
862 : */
863 : function getSetID() {
864 0 : return $this->setID;
865 : }
866 : /**
867 : * Gibt den Namen des Sets zurück, das die Rolle enthält
868 : *
869 : * @access public
870 : * @return string Name des Sets
871 : */
872 : function getSetName() {
873 0 : return $this->setName;
874 : }
875 : /**
876 : * Gibt das Icon für diese Rolle zurück.
877 : * (z.Z. nur allgemeines Rollenspiel-Icon)
878 : *
879 : * @access public
880 : * @param string $title title-Attribut des Icons, leer für Rollennamen
881 : * @return string HTML-Code zur Darstellung des Icons
882 : */
883 : function getIcon($title = "") {
884 0 : if (empty($title)) $title = $this->name;
885 0 : return Output::getIcon("icon_maske", $title);
886 : }
887 : /**
888 : * Gibt den auf die Eigenschaftsseite der Rolle verlinkten Rollennamen zurück.
889 : *
890 : * @access public
891 : * @param string $linkText Verlinktes Element (z. B. Icon), leer für den Rollennamen
892 : * @param string $title title-Attribut des Links
893 : * @param bool $changeToCourse Gibt an, ob in den Link der Parameter changeToCourse eingebaut werden soll, um in den das Rollenset enthaltenden Kurs zu wechseln.
894 : * @return string HTML-Link auf Eigenschaftenseite
895 : */
896 : function getPropertiesLink($linkText = "", $title = "Rollen-Eigenschaften anzeigen", $changeToCourse = false) {
897 0 : global $db, $settings;
898 0 : $dbp = $settings["dbPrefix"];
899 0 : $title = Data::toHTML($title, false);
900 0 : if (empty($linkText)) $linkText = Data::toHTML($this->name, false);
901 0 : if ($changeToCourse && ($courseID = $db->get_var("SELECT course_id FROM {$dbp}rolesets WHERE id='$this->setID'")) != $_SESSION["course"]) {
902 0 : $changeToCourse = "&changeToCourse=$courseID";
903 0 : } else {
904 0 : $changeToCourse = "";
905 : }
906 0 : return "<a href='".PATH_TO_ROOT."roleplay/userroles.php?action=showProperties&roleID=$this->ID$changeToCourse' title=\"$title\">$linkText</a>";
907 : }
908 : }
909 : ?>
|